Merge<F, S>
2つのrecordを引数に取って、mergeしたrecordを返す
使用例
code:ts
type Foo = {
a: number;
b: string;
};
type Bar = {
b: number;
c: boolean;
};
type A = Merge<Foo, Bar>; // { a: number; b: number; c: boolean; }
定義例
無難
code:ts
type Merge<
F extends Record<string, unknown>,
S extends Record<string, unknown>,
= {
K extends keyof S ? SK // 後ろ側であるSを先に書く : never;
};
code:ts
type Merge<
F extends Record<string, unknown>,
S extends Record<string, unknown>,
= MergeIntersections<Omit<F, keyof S> & S>;
ただintersectionするだけではだめ
code:ts
type Merge<..> = MergeIntersections<F & S>;
keyが競合した際にneverになるため挙動が変わる
code:ts
type Merge<
F extends Record<string, unknown>,
S extends Record<string, unknown>,
R = Omit<F, keyof S> & S,
= {
};
なぜかこうは書けない
code:ts
type Merge<
F extends Record<string, unknown>,
S extends Record<string, unknown>
= {
};
K extends keyof Sを満たさなかった時、F[K]と書けるのは自然な様に思うができない
そのため、無駄にK extends keyof Fの条件を追加する必要がある
これはたぶんコンパイラがそこまで賢くないから?